<?php
/**
 * CreateTime: 2022/5/16 10:29
 */

namespace App\Func;

use App\Consts\ResponseConsts\ResponseStatusConsts;
use App\Models\Company\CompanyModel;
use App\Models\Contract\ContractModel;
use App\Models\Contract\ContractTypeModel;
use Illuminate\Http\Exceptions\HttpResponseException;

class ContractFunc
{
    // 合同编号规则
    // XXXX - XX - 0000 000 - 00
    // XXXX : 公司单位识别码（一级编码）  如 四川省物流产业股份有限公司 ZB2
    // XX : 合同类型识别码（二级编码）    如 采购类合同 CG
    // 0000 : 合同签订年度（三级编码）    如 2022年 2022
    // 000 :合同年度签订序号、连续编码（四级编码）   如合同排列序号 001-999
    // 00 : 主合同下具体合同序号（五级编码）如    补充协议或者与主合同密切相连的合同 按照序号增加2位
    // 示例1 ZB2-CG-2022001 四川省物流产业股份有限公司-于2022年签订的第一个合同 合同类型为采购合同
    // 示例2 ZB2-CG-2022001-01  四川省物流产业股份有限公司-于2022年签订的第一个合同 合同类型为采购合同下的第一个补充协议
    /**
     * @param $contractTypeId  '合同类型'
     * @param int $argCompanyId 合同参数
     * @param int $parentContractId 如果有关联合同上级则传递
     * @return string
     */
    public static  function getContractCodeByContractType($contractTypeId,$argCompanyId = 0,$parentContractId = 0){
        $contractModel = new ContractModel();
        if(!$parentContractId){
            # 合同编号预定声明
            $contractCode = "";
            # 获取一级编码规则
            $companyId =  @TokenFuc::getCurrentStaffInfo()['company_id'];
            if($argCompanyId){
                $companyId = $argCompanyId;
            }
            $companyModel = new CompanyModel();
            $companyCode = @$companyModel->getCompanyInfoModelByCompanyId($companyId,["company_code"])["company_code"];
            if(!$companyCode){
                throw new HttpResponseException(ResponseFunc::returnJson(
                    'error',
                    '',
                    "编码规则错误 47 ",
                    ResponseStatusConsts::INTERNAL_SERVER_ERROR_500_RESPONSE_STATUS
                ));
            }
            # 组合一级编码
            $contractCode .= $companyCode.'-';
            # 根据合同类型获取合同
            $contractTypeModel = new ContractTypeModel();
            $contractTypeCode = @$contractTypeModel->getContractTypeInfo($contractTypeId,['contract_type_code'])['contract_type_code'];
            if(!$contractTypeCode){
                throw new HttpResponseException(ResponseFunc::returnJson(
                    'error',
                    '',
                    "编码规则错误 60",
                    ResponseStatusConsts::INTERNAL_SERVER_ERROR_500_RESPONSE_STATUS
                ));
            }
            # 组合二级编码
            $contractCode .= $contractTypeCode.'-';
            # 三级编码
            $dateCode = date("Y");
            # 组合三级编码
            $contractCode .= $dateCode.'-';
            # 四级编码
            # 获取所有合同条目
            $count = $contractModel->getContractCount()+1;
            # 填充
            $countCode = str_pad($count,3,0,STR_PAD_LEFT);
            # 组合
            $contractCode .=$countCode;
            return $contractCode;
        }else{
            # 获取父亲合同编号
            $parentContractCode = @$contractModel->getContractInfo($parentContractId,['contract_code'])['contract_code'];
            if(!$parentContractCode){
                throw new HttpResponseException(ResponseFunc::returnJson(
                    'error',
                    '',
                    "编码规则错误",
                    ResponseStatusConsts::INTERNAL_SERVER_ERROR_500_RESPONSE_STATUS
                ));
            }
            # 获取子合同条目
            $childCount = $contractModel->getContractCountByParentId($parentContractId)+1;
            $parentContractCode.= "-".str_pad($childCount,2,0,STR_PAD_LEFT);
            return $parentContractCode;
        }

    }




}
